Mặc dù NumPy được xây dựng trên C, một số thuật toán tính toán nặng nề sẽ chạm đến bức tường vector hóa. Điều này xảy ra khi độ trễ vốn có của bản chất động của Python vượt qua lợi ích từ sự trừu tượng cấp cao.
1. Phí Giả lập và Gói (Boxing)
Mỗi lần lặp trong một vòng lặp Python tiêu chuẩn đều bao gồm kiểm tra kiểu động và đếm tham chiếu. Ngay cả khi sử dụng các số vô hướng NumPy, việc "gói" dữ liệu C thô vào các đối tượng Python tạo ra một điểm nghẽn nghiêm trọng cho các hàm như $\text{logit}(p) = \log(p/(1-p))$. Xử lý các trường hợp biên trong C nhanh hơn rất nhiều:
>>> logit(0) -> -inf >>> logit(1) -> inf >>> logit(2) -> nan >>> logit(-2) -> nan
2. Dư thừa Mảng Trung gian
Các biểu thức NumPy thuần túy tạo ra các bộ đệm bộ nhớ tạm thời cho mỗi thao tác con. Việc mở rộng thông qua C-API cho phép Hợp nhất Kernel, nơi chuyển đổi logit được tính toán trong một lần đi qua mà không cần bộ nhớ phụ trợ.
3. Phụ thuộc Không gian
Các thao tác liên quan đến mẫu truy cập hàng xóm, chẳng hạn như lược đồ 2D:
$$B(I, J) = A(I, J) + (A(I-1, J) + A(I+1, J) + A(I, J-1) + A(I, J+1)) \cdot 0.5D0 + (A(I-1, J-1) + A(I-1, J+1) + A(I+1, J-1) + A(I+1, J+1)) \cdot 0.25D0$$
là khó biểu diễn hiệu quả thông qua cắt (slicing) mà không tạo ra các bản sao bộ nhớ thừa. Các phần mở rộng C cho phép thực hiện phép toán con trỏ trực tiếp, đồng bộ với bộ đệm (cache).